package com.carboy.launch.utils;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.Log;
import android.widget.Toast;

/***
 * @author james
 * @Package com.huixin.carnav.utils
 * @Title: BurglarUtils.java
 * @Description 防盗报警
 * @date 2015-8-26
 * @version 1.0
 * 
 */
public class BurglarUtils implements SensorEventListener {

	// 传感器管理器
	private SensorManager sensorManager;
	// 传感器
	private Sensor sensor;
	// 重力感应监听器
	private OnShakeListener onShakeListener;
	// 上下文对象context
	private Context context;
	// 手机上一个位置时重力感应坐标
	private int lastX;
	private int lastY;
	private int lastZ;
	// 上次检测时间
	private long lastUpdateTime;
	//是否第一次
	public boolean b = false;

	// 构造器
	public BurglarUtils(Context context) {
		// 获得监听对象
		this.context = context;
		start();
	}

	// 设置重力感应监听器
	public void setOnShakeListener(OnShakeListener listener) {
		onShakeListener = listener;
	}

	// 开始监听
	public void start() {
		// 获得传感器管理器
		sensorManager = (SensorManager) context
				.getSystemService(Context.SENSOR_SERVICE);
		if (sensorManager != null) {
			// 获得重力传感器
			sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
		}
		// 注册重力感应监听
		if (sensor != null) {
			sensorManager.registerListener(this, sensor,
					SensorManager.SENSOR_DELAY_GAME);
		}
	}

	// 停止检测
	public void stop() {
		// 取消监听
		if (sensorManager != null) {
			sensorManager.unregisterListener(this);
			Toast.makeText(context, "取消G-SENSOR", 1000).show();
		}
	}

	@Override
	public void onAccuracyChanged(Sensor sensor, int accuracy) {

	}

	@Override
	public void onSensorChanged(SensorEvent event) {

		if (event == null) {
			return;
		}

		if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
			// 现在检测时间
			long currentUpdateTime = System.currentTimeMillis();
			// 两次检测的时间间隔
			long timeInterval = currentUpdateTime - lastUpdateTime;

			// 判断是否达到了检测时间间隔
			if (timeInterval < Constants.UPTATE_INTERVAL_TIME) {
				return;
			}

			Log.i("timeInterval", "设置间隔-->" + Constants.UPTATE_INTERVAL_TIME);

			// 现在的时间变成last时间
			lastUpdateTime = currentUpdateTime;
			// 获得x,y,z坐标
			int x = (int) event.values[0];
			int y = (int) event.values[1];
			int z = (int) event.values[2];
			// 获得x,y,z的变化值
			int deltaX = x - lastX;
			int deltaY = y - lastY;
			int deltaZ = z - lastZ;
			// 将现在的坐标变成last坐标
			// double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY +
			// deltaZ
			// * deltaZ)
			// / timeInterval * 10000;

			int px = Math.abs(deltaX);
			int py = Math.abs(deltaY);
			int pz = Math.abs(deltaZ);
			int p = getMaxValue(px, py, pz);
			if (p >= Constants.SPEED_SHRESHOLD) {
				if (b == false) {
					b = true;
					// 振动报警
				} else {
					onShakeListener.onShake(1, p);
					Log.i("speed", "加速度：p：" + p);
					Log.i("speed", "车被振动");

				}

			} else {
				onShakeListener.onShake(2, py);
			}
			lastX = x;
			lastY = y;
			lastZ = z;
		}

	}

	/**
	 * 获取一个最大值
	 * 
	 * @param px
	 * @param py
	 * @param pz
	 * @return
	 */
	public int getMaxValue(int px, int py, int pz) {
		int max = 0;
		if (px > py && px > pz) {
			max = px;
		} else if (py > px && py > pz) {
			max = py;
		} else if (pz > px && pz > py) {
			max = pz;
		}

		return max;
	}

	// 摇晃监听接口
	public interface OnShakeListener {
		/**
		 * 
		 * @param type
		 *            振动类型 1,表示开启振动报警，2，振动级别
		 * @param speed
		 *            振动大小
		 */
		public void onShake(int type, double speed);
	}

}
